package com.sumainfor.pc.gmio.service.impl;

import com.qiniu.util.Json;
import com.sumainfor.common.Constants;
import com.sumainfor.common.config.RedisUtils;
import com.sumainfor.common.util.*;
import com.sumainfor.common.utlis.ComUtils;
import com.sumainfor.common.utlis.ConvertDateTime;
import com.sumainfor.common.utlis.Pager;
import com.sumainfor.common.utlis.ParamsCommon;
import com.sumainfor.pc.gmio.dao.*;
import com.sumainfor.pc.gmio.feign.Zfeign.ZpcMktFeign;
import com.sumainfor.pc.gmio.feign.Zfeign.ZwxTenantFeign;
import com.sumainfor.pc.gmio.service.SeBillPayService;
import com.sumainfor.pc.gmio.service.SeGasMeterService;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**账单支付信息
 */
@Service
public class SeBillPaySerivceImpl implements SeBillPayService {

    private ReentrantLock lock = new ReentrantLock(false);
    Logger log= LoggerFactory.getLogger(SeBillPaySerivceImpl.class);
    @Autowired
    private SeBillPayMapper seBillPayMapper;
    @Autowired
    private SeOverflowMapper seOverflowMapperlow;
    @Autowired
    private SePaymentHistoryMapper sePaymentHistoryMapper;
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private ZpcMktFeign zpcMktFeign;
    @Autowired
    private ZwxTenantFeign zwxTenantFeign;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private SeTenantBillMapper seTenantBillMapper;
    @Autowired
    private HoRechargeMapper hoRechargeMapper;
    /**
     *服务秘书审核账单
     *
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public JsonResult updateBillPay(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if(params.get("BiId")==null || params.get("PayId")==null || params.get("PayMoney")==null
                        ||params.get("PaId")==null || params.get("ifOverflow")==null || params.get("FirstMon")==null
                        || params.get("BiType")==null){
                    return result.putFailed("参数不正确");
                }else{
                    //账单类型  1.房租（合同） 2.公共事业费  3.维修费用  \r\n4.延期退  5.其他费用  6.退租账单 7.夜间开门   8.智能电表
                    if (params.get("BiType").toString().equals("8")){
                        //如果是智能电表就判断以下参数是否为空
                        if (params.get("Intelligent")==null || params.get("IntelligentId")==null
                                || params.get("Electricity")==null){
                            //Intelligent 智能设备供应商     0.蜂电   1.大华   2.科技侠   3.果加
                            if (String.valueOf(params.get("Intelligent")).equals("0")){
                                if(params.get("IntelligentUUID")==null){
                                    return result.putFailed("参数不正确");
                                }
                            }
                            return result.putFailed("参数不正确");
                        }

                    }
                }
                String ifOverflow=params.get("ifOverflow").toString();//账单是否溢出
                log.info("params:"+params);
                //历史缴费记录
                List<Map<String,Object>> list=(List<Map<String,Object>>)params.get("CostList");
                params.put("AuditId",ContextUtils.getUserId());//审核人编号
                params.put("by", ContextUtils.getUserId());//操作人
                params.put("term", "4");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                params.put("AuditTime",ConvertDateTime.getCurrentTime());//审核人时间
                ParamsCommon.commonUpdateParms(params);
                params.put("PayTime",params.get("updtm"));//本次支付时间
                //组装历史缴费记录参数
                Map<String,Object> map=new HashMap<String,Object>();
                map.put("by", ContextUtils.getUserId());//操作人
                map.put("term", "4");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                map.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonInsertParms(map);
                System.out.println("map:"+map);
                //新增历史收入账单
                for (int i=0;i<list.size();i++){
                    Map<String,Object> listMap=list.get(i);
                    //IfSouCount 0 前端本次新增， 1 已经存在
                    if (listMap.get("IfSouCount")!=null && String.valueOf(listMap.get("IfSouCount")).equals("0")&& !String.valueOf(listMap.get("PaymePrice")).equals("")){
                        listMap.putAll(map);
                        listMap.put("SouId",params.get("BiId"));//账单来源编号
                        listMap.put("TenId",params.get("TenId"));//客户编号
                        listMap.put("CorId",params.get("CorId"));//支付公司编号
                        listMap.put("PaymeType",1);//账单支付分类   1.公共事业费
                        listMap.put("RevTime",params.get("updtm"));//审核时间
                        System.out.println("listMap:"+listMap);
                        sePaymentHistoryMapper.addPaymentHistory(listMap);
                    }
                }
                if (ifOverflow.equals("0")){//ifOverflow 1 审核通过，账单溢出 0审核不通过 2 审核通过
//                    params.put("PatStats","1");//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
//                    Integer count=seBillPayMapper.updateBillPay(params);
                    params.put("Status","5");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）5被驳回
                    //(修改账单状态)
                    Integer count2=seTenantBillMapper.updateSeBillStatus(params);
                    seBillPayMapper.updateBillPay(params);
                    if (count2==1){
                        //房租账单是否是首月    0否   1.是
                        if (params.get("FirstMon").toString().equals("1")){
                            //到市场合同的信息为入住状态
                            Map<String,Object> epcMap=new HashMap<String,Object>();
                            epcMap.put("PaId",params.get("PaId"));
                            JsonResult marketResult=zpcMktFeign.updatePactForSeNo(params);
                            if(marketResult.get("errorCode").toString().equals("0")){
                                return  result.putSuccess("操作成功");
                            }else {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return marketResult;
                            }
                        }else{
                            result.putSuccess("操作成功");
                        }
                    }else{
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return   result.putFailed("服务器繁忙");

                    }
                }else if (ifOverflow.equals("1")){//1 账单溢出 2 账单足额支付 0账单审核不通过
                    params.put("Status","2");//1.待支付  2.支付完成  3待审核   4.账单废弃
                    params.get("CorId");//公司编号
                    //账单溢出编号
                    String UUID="";
                    Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "OveId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_overflow");
                    }});
                    if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
                        int number=Integer.valueOf(uuid.get("uuid").toString());
                        UUID= ComUtils.getLocalTrmSeqNum("ov",number);
                    }else{
                        UUID=ComUtils.getLocalTrmSeqNum("ov",0);
                    }
                    map.put("RevId",ContextUtils.getUserId());//账单溢出审核人编号
                    map.put("RevTime",params.get("updtm"));//账单溢出审核时间
                    map.put("SouId",params.get("BiId"));//账单来源编号
                    map.put("TenId",params.get("TenId"));//客户编号
                    map.put("OveId",UUID);//账单溢出编号
                    map.put("OveType",1);//账单溢出分类  1.公共事业费
                    map.put("OvePrice",params.get("yiMoney"));//账单溢出金额
                    seOverflowMapperlow.addOverflow(map);//新增房源溢出
                    params.put("PatStatus",3);//支付状态    1.未支付  2.支付成功
                    //修改支付信息
                    Integer count=seBillPayMapper.updateBillPay(params);
                    params.put("Status","2");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    //(修改账单状态)
                    Integer count2=seTenantBillMapper.updateSeBillStatus(params);
                    /***********************运营部修改 成功后到市场部修改数据************************/
                    if (count!=null && count2!=null &&  count==1 && count2==1){
                        //账单类型  1.房租（合同） 2.公共事业费  3.维修费用  \r\n4.延期退  5.其他费用  6.退租账单 7.夜间开门   8.智能电表
                        if (String.valueOf(params.get("BiType")).equals("1")){
                            Map<String,Object> epcMap=new HashMap<String,Object>();
                            epcMap.put("PaId",params.get("PaId"));
                            JsonResult marketResult=zpcMktFeign.updatePactForSe(params);
                            if(marketResult.get("errorCode")!=null&&marketResult.get("errorCode").toString().equals("0")){
                                result.putSuccess("操作成功");
                            }else{
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return result.putFailed("服务器繁忙");
                            }
                        }else if (String.valueOf(params.get("BiType")).equals("8")){
                            //智能设备供应商 0.蜂电 1.大华 2.科技侠 3.果加
                            if (String.valueOf(params.get("Intelligent")).equals("0")){
                                String InteDeviceBeeToken=redisUtils.get("InteDeviceBeeToken");
                                //如果获取不到就重新登录
                                if (InteDeviceBeeToken==null) {
                                    Map<String, Object> tokenMap = new HashMap<String, Object>();
                                    params.put("version","0116010101");//版本号 默认 0116010101
                                    params.put("appid", InteDeviceBeeConfig.APP_ID);
                                    tokenMap= InteDeviceBeeUtil.userLogin(InteDeviceBeeConfig.USERID, InteDeviceBeeConfig.PASS,params);
                                    if (tokenMap.get("Code").toString().equals("0")) {
                                        InteDeviceBeeToken = tokenMap.get("Expand").toString();
                                        //token存到redis中 有效时长一个小时
                                        redisUtils.set("InteDeviceBeeToken", InteDeviceBeeToken,3600);
                                    } else {
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return result.putFailed("token获取失败");
                                    }
                                }
                                Map<String,Object> headMap=new HashMap<String,Object>();
                                headMap.put("uid",InteDeviceBeeConfig.UID);
                                headMap.put("token",InteDeviceBeeToken);
                                //蜂电 电表充值
                                Map<String,Object> beeResult=InteDeviceBeeUtil.accountThreshold(params.get("IntelligentUUID").toString(),params.get("Electricity").toString(),headMap);
                                System.out.println("第三方返回的数据:"+beeResult);
                                if (beeResult.get("Code")!=null && beeResult.get("Code").toString().equals("0")){
                                    result.putSuccess("操作成功");
                                }else{
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return  result.putFailed("服务器繁忙");
                                }
                            }else if (String.valueOf(params.get("Intelligent")).equals("1")){
                                String InteDaHuaToken=redisUtils.get("InteDaHuaToken");
                                //如果获取不到就重新登录
                                if (InteDaHuaToken==null){
                                    /*获取token*/
                                    Map<String,Object> DaParams=new HashMap<String, Object>();
                                    DaParams.put("pw", InteDeviceDaHuaConfig.PW);
                                    DaParams.put("userName",InteDeviceDaHuaConfig.USERNAME);
                                    DaParams=InteDeviceDaHuaUtil.getToken(DaParams);
                                    if (DaParams.get("code")!=null && DaParams .get("code").toString().equals("1")){//1 状态码 请求成功
                                        InteDaHuaToken=DaParams.get("data").toString();
                                        //token有效期2个小时，所有接口Code=0 ，token失效 需要重新获取
                                        redisUtils.set("InteDaHuaToken",InteDaHuaToken,3600*2);
                                    }else{
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return result.putFailed("token获取失败");
                                    }
                                }
                                /*根据token和设备id查询余量/已使用量*/
                                Map<String,Object> getParams=new HashMap<String, Object>();
                                getParams.put("token",InteDaHuaToken);
                                getParams.put("meter_id",params.get("IntelligentId"));
                                getParams=InteDeviceDaHuaUtil.getRemainById(getParams);
                                if (getParams.get("code")!=null && String.valueOf(getParams.get("code")).equals("1")){
                                    BigDecimal price=new BigDecimal(getParams.get("price").toString());//大华电表单价
                                    BigDecimal Electricity=new BigDecimal(params.get("Electricity").toString());//充值电量
                                    Map<String,Object> payParams=new HashMap<String, Object>();
                                    payParams.put("token",InteDaHuaToken);
                                    payParams.put("meter_id",params.get("IntelligentId"));
                                    payParams.put("amount",Electricity.divide(price,2).multiply(new BigDecimal(100)));
                                    payParams.put("tra_id",UUIDUtils.generateShortUuid());
                                    System.out.println("大华充值:"+payParams);
                                    payParams=InteDeviceDaHuaUtil.payAmountById(payParams);
                                    if (payParams.get("code")!=null && String.valueOf(payParams.get("code")).equals("1")){
                                        result.putSuccess("操作成功");
                                    }else{
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return result.put( "第三方服务器繁忙");
                                    }
                                }else{
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return result.put("第三方服务器繁忙");
                                }
                            }
                        }else{
                            result.putSuccess("操作成功");
                        }
                    }else{
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return result.putFailed("服务器繁忙");
                    }
                }else if ( ifOverflow.equals("2")){
                    params.put("PatStatus","3");//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                    Integer count=seBillPayMapper.updateBillPay(params);
                    params.put("Status","2");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）5被驳回
                    //(修改账单状态)
                    Integer count2=seTenantBillMapper.updateSeBillStatus(params);
                    seBillPayMapper.updateBillPay(params);
                    System.out.println("count："+count);
                    if (count!=null && count2!=null &&count==1 && count2==1){
                        //房租账单是否是首月    0否   1.是
                        if (params.get("FirstMon").toString().equals("1")){
                            //到市场合同的信息为入住状态
                            Map<String,Object> epcMap=new HashMap<String,Object>();
                            epcMap.put("PaId",params.get("PaId"));
                            JsonResult marketResult=zpcMktFeign.updatePactForSe(params);
                            if(marketResult.get("errorCode").toString().equals("0")){
                                return  result.putSuccess("操作成功");
                            }else {
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return marketResult;
                            }
                        }else{
                            if (String.valueOf(params.get("BiType")).equals("1")){
                                Map<String,Object> epcMap=new HashMap<String,Object>();
                                epcMap.put("PaId",params.get("PaId"));
                                JsonResult marketResult=zpcMktFeign.updatePactForSe(params);
                                if(marketResult.get("errorCode")!=null&&marketResult.get("errorCode").toString().equals("0")){
                                    result.putSuccess("操作成功");
                                }else{
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return result.putFailed("服务器繁忙");
                                }
                            }else if (String.valueOf(params.get("BiType")).equals("8")){
                                //智能设备供应商 0.蜂电 1.大华 2.科技侠 3.果加
                                if (String.valueOf(params.get("Intelligent")).equals("0")){
                                    String InteDeviceBeeToken=redisUtils.get("InteDeviceBeeToken");
                                    //如果获取不到就重新登录
                                    if (InteDeviceBeeToken==null) {
                                        Map<String, Object> tokenMap = new HashMap<String, Object>();
                                        params.put("version","0116010101");//版本号 默认 0116010101
                                        params.put("appid", InteDeviceBeeConfig.APP_ID);
                                        tokenMap= InteDeviceBeeUtil.userLogin(InteDeviceBeeConfig.USERID, InteDeviceBeeConfig.PASS,params);
                                        if (tokenMap.get("Code").toString().equals("0")) {
                                            InteDeviceBeeToken = tokenMap.get("Expand").toString();
                                            //token存到redis中 有效时长一个小时
                                            redisUtils.set("InteDeviceBeeToken", InteDeviceBeeToken,3600);
                                        } else {
                                            return result.putFailed("token获取失败");
                                        }
                                    }
                                    Map<String,Object> headMap=new HashMap<String,Object>();
                                    headMap.put("uid",InteDeviceBeeConfig.UID);
                                    headMap.put("token",InteDeviceBeeToken);
                                    //蜂电 电表充值
                                    Map<String,Object> beeResult=InteDeviceBeeUtil.accountThreshold(params.get("IntelligentUUID").toString(),params.get("Electricity").toString(),headMap);
                                    System.out.println("第三方返回的数据:"+beeResult);
                                    if (beeResult.get("Code")!=null && beeResult.get("Code").toString().equals("0")){
                                        result.putSuccess("操作成功");
                                    }else{
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return  result.putFailed("服务器繁忙");
                                    }
                                }else if (String.valueOf(params.get("Intelligent")).equals("1")){
                                    String InteDaHuaToken=redisUtils.get("InteDaHuaToken");
                                    //如果获取不到就重新登录
                                    if (InteDaHuaToken==null){
                                        /*获取token*/
                                        Map<String,Object> DaParams=new HashMap<String, Object>();
                                        DaParams.put("pw", InteDeviceDaHuaConfig.PW);
                                        DaParams.put("userName",InteDeviceDaHuaConfig.USERNAME);
                                        DaParams=InteDeviceDaHuaUtil.getToken(DaParams);
                                        if (DaParams.get("code")!=null && DaParams .get("code").toString().equals("1")){//1 状态码 请求成功
                                            InteDaHuaToken=DaParams.get("data").toString();
                                            //token有效期2个小时，所有接口Code=0 ，token失效 需要重新获取
                                            redisUtils.set("InteDaHuaToken",InteDaHuaToken,3600*2);
                                        }else{
                                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                            return result.putFailed("token获取失败");
                                        }
                                    }
                                    /*根据token和设备id查询余量/已使用量*/
                                    Map<String,Object> getParams=new HashMap<String, Object>();
                                    getParams.put("token",InteDaHuaToken);
                                    getParams.put("meter_id",params.get("IntelligentId"));
                                    getParams=InteDeviceDaHuaUtil.getRemainById(getParams);
                                    if (getParams.get("code")!=null && String.valueOf(getParams.get("code")).equals("1")){
                                        BigDecimal price=new BigDecimal(getParams.get("price").toString());//大华电表单价
                                        BigDecimal Electricity=new BigDecimal(params.get("Electricity").toString());//充值电量
                                        Map<String,Object> payParams=new HashMap<String, Object>();
                                        payParams.put("token",InteDaHuaToken);
                                        payParams.put("meter_id",params.get("IntelligentId"));
                                        payParams.put("amount",Electricity.divide(price,2).multiply(new BigDecimal(100)));
                                        payParams.put("tra_id",UUIDUtils.generateShortUuid());
                                        payParams=InteDeviceDaHuaUtil.payAmountById(payParams);
                                        if (payParams.get("code")!=null && String.valueOf(payParams.get("code")).equals("1")){
                                            result.putSuccess("操作成功");
                                        }else{
                                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                            return result.put( "第三方服务器繁忙");
                                        }
                                    }else{
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return result.put("第三方服务器繁忙");
                                    }
                                }
                            }else{
                                result.putSuccess("操作成功");
                            }
                        }
                    }else{
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return   result.putFailed("服务器繁忙");

                    }
                } else{
                    return result.putFailed("服务器繁忙");
                }
                //修改溢出的费用已抵扣
                List<Map<String,Object>> selecTionList=(List<Map<String,Object>>)params.get("selection");
                //保存溢出账单编号
                List<String> oveIdList=new ArrayList<String>();
                for (Map<String,Object> selecTionMap : selecTionList){

                    if (selecTionMap.get("OveId")!=null){
                        oveIdList.add(selecTionMap.get("OveId").toString());
                    }
                }
                params.put("Deduction","1");//是否抵扣   0未抵扣  1抵扣
                params.put("oveIdList",oveIdList);
                seOverflowMapperlow.updateSeDeduction(params);
            } catch (Exception e) {
                result.putFailed("服务器繁忙");
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }

    /**
     * 租客续签的时候上传首月的水电押金支付凭证
     * @param params
     * @return
     */
    public JsonResult addSeBillPay(Map<String,Object> params){
        JsonResult result=new JsonResult();
        BigDecimal BiMoney=new BigDecimal("0");//账单的金额
        BigDecimal PayMoney=new BigDecimal("0");//实际支付金额
        Integer count1=0;//优惠卷
        Integer count2=0;//支付信息
        Integer count3=0;//账单修改
        if (params.get("PayFile")==null|| params.get("TenId")==null || params.get("BiId")==null
                || params.get("BiMoney")==null ||params.get("IfCoucode")==null){
            return result.putFailed("参数不正确");
        }
        //如果使用了优惠卷就判断相关的参数是否为空  IfCouId0未使用优惠卷 1使用了优惠卷
        if (params.get("IfCoucode").toString().equals("1")){
            if (params.get("Coucode")==null || params.get("Facevalue")==null){
                return result.putFailed("参数不正确");
            }else {
                //BiMoney 实际支付金额=账单金额减去优惠卷金额
                PayMoney=BiMoney.subtract(new BigDecimal(params.get("Facevalue").toString()));
                //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
                JsonResult zwxTenantResult=zwxTenantFeign.updateHotc(params);
                if (zwxTenantResult.get("errorCode").toString().equals("0")){
                    count1=(Integer) zwxTenantResult.get("result");
                    if (count1<=0){
                        return result.putFailed("服务器繁忙");
                    }
                }else{
                    return result.putFailed("服务器繁忙");
                }

            }
        }
        BiMoney=new BigDecimal(params.get("BiMoney").toString());//账单金额
        //支付信息编号
        String UUID="";
        Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
            put("uuid", "PayId");
            put("database", Constants.DATA_SOURCE_GMIO);
            put("surface", "tcgmio_bill_pay");
        }});

        if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
            Integer number=Integer.valueOf(uuid.get("uuid").toString());
            UUID= ComUtils.getLocalTrmSeqNum("bi",number);
        }else{
            UUID=ComUtils.getLocalTrmSeqNum("bi",0);
        }
        //组装支付信息参数
        Map<String,Object> tenPayMap=new HashMap<String,Object>();
        params.put("PayId",UUID);
        params.put("TenId",params.get("TenId"));//租客编号
        params.put("Shape","1");//0.线上   1.线下
        params.put("PayMode","2");//支付方式  1.微信  2.支付宝
//        params.put("TransactionId",params.get("Source"));//0.线上   1.线下
        params.put("BiMoney",BiMoney);//账单金额
        params.put("PayMoney",PayMoney);//支付的金额
        params.put("Couponcd",params.get("CouId"));//优惠卷编号
        params.put("Couponamt",params.get("Facevalue"));//优惠卷金额
        params.put("PatStatus","1");//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
        params.put("PatStats","2");//支付状态    1.未支付  2.支付成功
        params.put("by", "auto");//操作人
        params.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
        params.put("fnc",
                this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
        ParamsCommon.commonInsertParms(params);
        params.put("PayTime",params.get("instm"));//本次支付时间
        //新增支付信息
        System.out.println("params:"+params);
        count2=seBillPayMapper.addSeBillPay(params);
        //组装修改账单参数(修改首月的水电押金账单)
        Map<String,Object> renBillMap=new HashMap<String,Object>();
        renBillMap.put("BiId",params.get("BiId"));
        renBillMap.put("DepositType","2");//房租类型   1.房租房租押金   2.水电押金
        renBillMap.put("Status",3);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
        renBillMap.put("PayId",UUID);//支付信息编号
        renBillMap.put("by", "auto");//操作人
        renBillMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
        renBillMap.put("fnc",
                this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
        ParamsCommon.commonInsertParms(renBillMap);
        //修改账单的信息
        count3=seTenantBillMapper.updateSeBillStatus(renBillMap);
        if (count2>0 && count3>0){
            result.putSuccess("操作成功");
        }else{
            result.putFailed("服务器繁忙");
        }
        return result;
    }

    /**
     *智能设备充值被驳回后重新上传支付凭证
     *
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public JsonResult updateBillPayStatus(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if(params.get("IfCoucode")==null || params.get("BiType")==null || params.get("PayId")==null
                        || params.get("BiType")==null || params.get("BiId")==null){
                    return result.putFailed("参数不正确");
                }
                //如果使用了优惠卷就判断相关的参数是否为空 IfCoucode 0未使用 1已使用
                if (params.get("IfCoucode").toString().equals("1")){
                    if (params.get("Coucode")==null || params.get("Facevalue")==null || params.get("PayFile")==null){
                        return result.putFailed("参数不正确");
                    }
                }
                params.put("PatStatus","1");//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                params.put("PatStats","1");//支付状态    1.未支付  2.支付成功
                params.put("by", "auto");//操作人
                params.put("term", "4");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonUpdateParms(params);
                Integer count=seBillPayMapper.updateBillPayStatus(params);
                params.put("Status","3");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                //(修改账单状态)
                Integer count2=seTenantBillMapper.updateSeBillStatus(params);
                if (count!=null && count2!=null && count==1  && count2==1){
                    result.putSuccess("操作成功");
                }else{
                    result.putFailed("服务器繁忙");
                }
            } catch (Exception e) {
                result.putFailed("服务器繁忙");
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }
    /**
     * 智能设备充值被驳回取消账单
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public JsonResult updateBillDiscard(Map<String, Object> params) {
        JsonResult result=new JsonResult();
        /**
         * 加锁操作
         */
        lock.lock();
        try{
            try {
                if( params.get("PayId")==null || params.get("ReChargeId")==null || params.get("BiId")==null){
                    return result.putFailed("参数不正确");
                }
                params.put("Status","4");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                params.put("delfg","1");//0 正常 1 废弃
                params.put("by", "auto");//操作人
                params.put("term", "4");// 更新端 Update端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonUpdateParms(params);
                //修改账单支付信息废弃
                Integer count=seBillPayMapper.updateSeBillDelfg(params);
                //修改账单废弃
                Integer count2=hoRechargeMapper.updateHrdelfg(params);
                //修改账单废弃
                Integer count3=seTenantBillMapper.updateSeBillStatus(params);
                if (count!=null && count2!=null && count3!=null  && count==1  && count2==1  && count3==1){
                    result.putSuccess("操作成功");
                }else{
                    result.putFailed("服务器繁忙");
                }
            } catch (Exception e) {
                result.putFailed("服务器繁忙");
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
        }
        finally {
            lock.unlock();
        }
        return result;
    }
}
